#ifndef PLUGINMOTORBIKE_H
#define PLUGINMOTORBIKE_H

#include "PluginMotorBikeAPI.h"
#include "PluginManager/pluginBase.h"
#include "DataProperty/modelTreeItemType.h"
#include "mainWindow/mainWindow.h"
#include "DataProperty/ParameterTable.h"
#include "DataProperty/ParameterSelectable.h"
#include "DataProperty/ParameterInt.h"
#include "DataProperty/ParameterBool.h"
#include "DataProperty/ParameterDouble.h"

namespace IO
{
    class SolverIO;
}
class IOConfigure;
namespace ModelData
{
    class ModelDataBase;
}
namespace GUI
{
    class  MainWindow;
}

namespace Plugins {
static GUI::MainWindow* mainWindow;
class PLUGINMOTORBIKEAPI PluginMotorBike : public PluginBase
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数，在Register函数中调用
     * @param m 主窗口对象
     * @since 1.0.0
     */
    PluginMotorBike(GUI::MainWindow *m);
    /**
     * @brief 加载插件时，FastCAE主程序调用该函数，主要用于向主程序注入接口
     * @return bool 返回是否注入成功的布尔值
     * @since 1.0.0
     */
    bool install() override;
    /**
     * @brief 卸载插件时，FastCAE主程序调用该函数，主要用于擦出由install注入的接口
     * @return bool 返回是否卸载成功的布尔值
     * @since 1.0.0
     */
    bool uninstall() override;
    /**
     * @brief 双语翻译，该函数要求实现插件的双语翻译，翻译的对象为自定义的GUI界面。参数lang的值有两种可能，
     * 分别为“English”和“Chinese”。该函数由平台调用。函数的重写实现需要遵循Qt5的双语处理方法。
     * @param lang
     * @since 1.0.0
     */

public:
    /**
     * @brief 用于在打印提示信息时获取主窗口对象
     * @return 主窗口对象
     * @since 1.0.0
     */
    static GUI::MainWindow* getMainWindow();
};
}

extern "C"
{
    /**
    * @brief FastCAE在动态加载插件（链接库）的时候采用根据函数名称寻找入口
    * @param m 主窗口对象指针
    * @param plugs 插件管理列表的指针
    * @since 1.0.0
    */
    void PLUGINMOTORBIKEAPI Register(GUI::MainWindow*m, QList<Plugins::PluginBase*>*plugs);
    /**
     * @brief 求解器输入文件写出，在install方法中注册
     * @param path
     * @param d
     * @return bool
     * @since 1.0.0
     */
    bool PLUGINMOTORBIKEAPI inputFile(QString path, ModelData::ModelDataBase* modelData);
    /**
     * @brief 求解器输出文件转换，在install方法中注册
     * @return bool
     * @since 1.0.0
     */
    bool PLUGINMOTORBIKEAPI outputTransfer(QString);
    /**
     * @brief 拷贝文件夹,复制字典文件到case目录下
     * @param source 拷贝文件的源文件夹
     * @param destination 拷贝文件的目标文件夹
     * @return bool 拷贝结果的布尔值
     * @since 1.0.0
     */
    bool PLUGINMOTORBIKEAPI copyDirectoryFiles(const QString &source, const QString &destination);
    /**
     * @brief 发送消息到控制台
     * @param hintInfo 要显示到主窗口程序控制台的消息内容
     * @since 1.0.0
     */
    void PLUGINMOTORBIKEAPI sendMessageToConsole(QString message);
    /**
     * @brief 获取一般型（整数、布尔值、浮点、字符串、枚举）数据
     * @param name 要获取参数值的参数名
     * @param modelData FastCAE的模型类对象
     * @return 返回要获取的参数值
     */
    char* getParameterValue(QString name, ModelData::ModelDataBase *modelData);
    /**
     * @brief 获取表格型数据
     * @param name 要获取参数值的参数名
     * @param modelData FastCAE的模型类对象
     * @return 返回要获取的参数值
     */
    DataProperty::ParameterTable* getParameterTableValue(QString name, ModelData::ModelDataBase *modelData);
    /**
     * @brief 将算例树信息写出到求解器输入文件
     * @param filename 求解器输入文件
     * @param modelData
     * @return bool
     * @since 1.0.0
     */
    bool PLUGINMOTORBIKEAPI writeInputFile(QString filename, ModelData::ModelDataBase* modelData);
}
#endif // PLUGINMOTORBIKE_H
